package Package.StreamStream.StreamStreamIntermediateOperationMethod;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Stream;

public class StreamStreamIntermediateOperationMethod {
    public static  void StreamStreamIntermediateOperationMethod(){
//Stream流中间操作方法【应用】
//概念
//中间操作的意思是，执行完此方法之后，Stream流依然可以继续执行其他操作
//        常见方法
//        方法名 说明
//Stream filter(Predicate predicate) 用于对流中的数据进行过滤
        ArrayList<String> list = new ArrayList<String>();
        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");
        list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);
        System.out.println("****************************************");
        list.stream().filter(s->s.length()==3).forEach(System.out::println);
        System.out.println("****************************************");
        list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(System.out::println);
        System.out.println("****************************************");
        //Stream limit(long maxSize) 返回此流中的元素组成的流，截取前指定参数个数的数据
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("****************************************");
//Stream skip(long n) 跳过指定参数个数的数据，返回由该流的剩余元素组成的流
        list.stream().skip(5).forEach(System.out::println);
        System.out.println("****************************************");
        list.stream().skip(5).limit(2).forEach(System.out::println);
        System.out.println("****************************************");

//static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流
        Stream<String> a =list.stream().skip(2);
        Stream<String> b= list.stream().limit(3);
        Stream.concat(a,b).forEach(System.out::println);
        System.out.println("****************************************");
        Stream<String> c =list.stream().skip(2);
        Stream<String> d= list.stream().limit(3);
        Stream.concat(c,d).distinct().forEach(System.out::println);
        System.out.println("****************************************");

//Stream distinct() 返回由该流的不同元素（根据Object.equals(Object) ）组成的流
//Stream sorted() 返回由此流的元素组成的流，根据自然顺序排序
        list.stream().sorted().forEach(System.out::println);
        System.out.println("****************************************");
//Stream sorted(Comparator comparator)返回由该流的元素组成的流，根据提供的Comparator进行排序
list.stream().sorted(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int l1=o1.length();
        int l2=o2.length();
        if (l2>=l1) {
            return 1;
        }else {
            return 0;
        }
    }
}).forEach(System.out::println);
        System.out.println("****************************************");
//Stream map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流
        ArrayList<String> list1 = new ArrayList<String>();
        list1.add("10");
        list1.add("20");
        list1.add("30");
        list1.add("40");
        list1.add("50");
        int result=list1.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(result);
//IntStream mapToInt(ToIntFunction mapper)返回一个IntStream其中包含将给定函数应用于此流的元素的结果
        }
}
